#include<iostream>
using namespace std;
//n:城市顶点个数. m:城市间路线的条数. 
//map[][]:地图对应的带权邻接矩阵. dist[]:记录源点u到某顶点的最短路径长度。
//p[]:记录源点到某顶点的最短路径上的该顶点的前一个顶点(前驱).
//flag[]：flag[i]=true说明顶点i已加入到集合S，否则该顶点属于集合V-S
const int N=100;	//城市个数可修改
const int INF=1e7;	//初始化无穷大
int map[N][N],dist[N],p[N],n,m;	//n为城市个数，m为城市间路线的条数
bool flag[N];	//如果flag[i]=true,说明该顶点i已经加入到集合S；否则i属于集合V-S
void Dijkstra(int u){
    for(int i=1;i<=n;i++){
        dist[i]=map[u][i];
        flag[i]=false;
        if(dist[i]==INF){
            p[i]=-1;
        }else{
            p[i]=u;
        }
    }
    flag[u]=true;
    dist[u]=0;
    for(int i=0;i<=n;i++){
        int temp=INF,t=u;
        for(int j=1;j<=n;j++){
            if(!flag[j]&&dist[j]<temp){
                temp=dist[j];
                t=j;
            }
        }
        if(t==u) return;
        flag[t]=true;
        for(int j=1;j<=n;j++){
            if(!flag[j]&&map[t][j]<INF)
                if(dist[j]>dist[t]+map[t][j]){
                    dist[j]=dist[t]+map[t][j];
                    p[j]=t;
                }
        }
    }
}
int main(){
    int t,s,d,a,b,num,x;
    cin>>t>>s>>d;
    for(int i=1;i<=t;i++){
        cin>>a>>b;
        cin>>map[a][b];
    }
    for(int i=1;i<=s;i++){
        cin>>num;
        map[1][num]=map[num][1]=0;
    }
    for(int i=0;i<d;i++){
        cin>>x;
        Dijkstra(x);
    }
}
